package main

import "fmt"

// 继承~  要继承某个结构体，直接在在结构体的字段中加上要继承的结构体名称
func main() {

	var pu *Pupil = &Pupil{}
	(*pu).Student.Name = "tom"
	(*pu).Student.Age = 8

	//调用特有的方法
	(*pu).testing()
	//调用共有的方法
	(*pu).Student.setScore(88)
	(*pu).Student.showInfo()
	var res1 float64 = (*pu).Student.getSum(11.0, 88.0)
	fmt.Println(res1)

	var g *Graduate = &Graduate{}
	(*g).Student.Name = "mary"
	(*g).Student.Age = 20
	//调用特有的方法
	(*g).testing()
	//调用共有的方法
	(*g).Student.setScore(90)                  // 也可以 (*g).setScore(90)
	var res2 = (*g).Student.getSum(88.0, 77.0) //(*g).getSum(88.0, 77.0)
	g.showInfo()                               //【姓名】=mary 【年龄】=20 【分数】=90
	(*g).Student.showInfo()                    //(*g).showInfo()  姓名=mary 年龄=20 分数=90
	fmt.Println(res2)

}

// Student
// @Description:  Student
type Student struct {
	Name  string
	Age   int
	Score float64
}

// 共有的方法1
func (stu *Student) showInfo() {
	fmt.Printf("姓名=%v 年龄=%v 分数=%v\n", (*stu).Name, (*stu).Age, (*stu).Score)
}

// 共有的方法2
func (stu *Student) setScore(sc float64) {
	(*stu).Score = sc
}

// 共有的方法3
func (stu *Student) getSum(n1 float64, n2 float64) float64 {
	return n2 + n1
}

// Pupil 小学生
type Pupil struct {
	Student //潜入了匿名Student结构体，继承
}

// 特有方法~
func (p *Pupil) testing() {
	fmt.Println("小学生正在考试....")
}

// Graduate 大学生
type Graduate struct {
	Student //潜入了匿名Student结构体
}

// 特有方法~
func (g *Graduate) testing() {
	fmt.Println("大学生正在考试....")
}

// 特有方法~
func (g *Graduate) showInfo() {
	fmt.Printf("【姓名】=%v 【年龄】=%v 【分数】=%v\n", (*g).Name, (*g).Age, (*g).Score)
}
